package be.vdab.entities;

import java.io.Serializable;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.sql.Timestamp;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CollectionTable;
import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
//import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.Version;

import be.vdab.enums.Geslacht;
import be.vdab.valueobjects.EmailAdres;

@Entity 
@Table(name = "docenten")
//@NamedQuery(name= "Docent.findByWeddeBetween", query="select d from Docent d where d.wedde between :van and :tot order by d.wedde, d.docentNr")
public class Docent implements Serializable {   
	private static final long serialVersionUID = 1L;
	@Id	
	@GeneratedValue   
	private long docentNr;
	private String voornaam;   
	private String familienaam;
	private BigDecimal wedde;
	@Enumerated(EnumType.STRING)  
	private Geslacht geslacht;
	@ElementCollection
	@CollectionTable(name="docentenbijnamen", joinColumns = @JoinColumn(name="docentNr"))
	@Column(name="Bijnaam")
	private Set<String> bijnamen;
	@ManyToOne(fetch = FetchType.LAZY) 
	@JoinColumn(name = "CampusNr") 
	private Campus campus;
	@Embedded
	private EmailAdres emailAdres;
	@Version 
	private Timestamp versie; 
	
	public void setEmailAdres(EmailAdres emailAdres) {
		this.emailAdres = emailAdres;
	}
	public EmailAdres getEmailAdres() {
		return emailAdres;
	}
	protected Docent() {   }	
	public Docent(String voornaam, String familienaam, BigDecimal wedde, Geslacht geslacht, EmailAdres emailAdres) {
	    setVoornaam(voornaam);
	    setFamilienaam(familienaam);
	    setWedde(wedde);
	    setGeslacht(geslacht);
	    bijnamen = new HashSet<>();
	    setEmailAdres(emailAdres);
	}
	public Campus getCampus() {
		  return campus;
	}
	public void setCampus(Campus campus) {
		if(this.campus != null && this.campus.getDocenten().contains(this)){
			this.campus.removeDocent(this);
		}
		this.campus = campus;
		if(campus != null && ! campus.getDocenten().contains(this)){
			campus.addDocent(this);
		}
	} 
	public Geslacht getGeslacht() {
		return geslacht;
	}
	public void setGeslacht(Geslacht geslacht) {
		this.geslacht = geslacht;
	}
	public void opslag(BigDecimal percentage) {
	    BigDecimal factor = BigDecimal.ONE.add(
	      percentage.divide(new BigDecimal(100)));
	    wedde = wedde.multiply(factor).setScale(2, RoundingMode.HALF_UP);
	}
	public long getDocentNr() {
		return docentNr;
	}
	public String getVoornaam() {
		return voornaam;
	}
	public void setVoornaam(String voornaam) {
		this.voornaam = voornaam;
	}
	public String getFamilienaam() {
		return familienaam;
	}
	public void setFamilienaam(String familienaam) {
		this.familienaam = familienaam;
	}
	public BigDecimal getWedde() {
		return wedde;
	}
	public void setWedde(BigDecimal wedde) {
		this.wedde = wedde;
	}
	public String getNaam() {
		return voornaam + ' ' + familienaam;
	}
	public Set<String> getBijnamen(){
		return Collections.unmodifiableSet(bijnamen);
	}
	public void addBijnaam(String bijnaam){
		bijnamen.add(bijnaam);
	}
	public void removeBijnaam(String bijnaam) { 
		  bijnamen.remove(bijnaam);
	}
	@ManyToMany(mappedBy = "docenten")
	private Set<Verantwoordelijkheid> verantwoordelijkheden;
	public void addVerantwoordelijkheid(Verantwoordelijkheid verantwoordelijkheid){
		verantwoordelijkheden.add(verantwoordelijkheid);
		if(!verantwoordelijkheid.getDocenten().contains(this)){
			verantwoordelijkheid.addDocent(this);
		}
	}
	public void removeVerandwoordelijkheid(Verantwoordelijkheid verantwoordelijkheid){
		verantwoordelijkheden.remove(verantwoordelijkheid);
		if(verantwoordelijkheid.getDocenten().contains(this)){
			verantwoordelijkheid.removeDocent(this);
		}
	}
	public Set<Verantwoordelijkheid> getVerantwoordelijkheden(){
		return Collections.unmodifiableSet(verantwoordelijkheden);
	}
	@Override
	public String toString() {
	    return docentNr + ":" + voornaam + " " + familienaam;
	}
	@Override
	public boolean equals(Object obj) {
	  if (!(obj instanceof Docent)) {
	    return false;
	  }
	  return ((Docent)obj).emailAdres.equals(this.emailAdres);
	}
	@Override
	public int hashCode() {
	  return emailAdres.hashCode();
	}
} 